package com.stu.day05;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Calendar(线程不安全),Calendar 类是 Date 类的一个高级封装
 * 与Date不同的是,Calendar里面的获取(设置日期等操作)年,月,日方法名"相同",参数不同
 * 如cal.get(Calendar.YEAR),唯一例外的方法cal.getTime()返回Date对象
 * 单独获取年,月,日(用字符串接收)  ||整体获取年月日(Date类接收)
 * 单独设置年,月,日  ||整体设置年月日
 * 字符串接收格式化输出的年月日(format方法参数为Date对象)
 * 解析字符串为日期(通过格式化类的parse方法转化为Date对象)
 * SimpleDateFormat格式化和解析Date对象的类!!!(线程不安全)
 *
 * @author zy
 * @date 2025/1/27 15:31
 */
public class CalendarDemo {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();

//        int year = cal.get(1);         //获取年,Calendar中1代表年,2代表月...
        int year = cal.get(Calendar.YEAR);   //与Date类不同,Date里面是d.getYear();d.getTime()等
        System.out.println("年:"+year);

//        cal.set(1,2024);    //设置年
        cal.set(Calendar.YEAR, 2024);
        System.out.println("自定义年:"+cal.get(1));

        cal.set(2025,5-1,5);   //设置年月日,注意月份要减一!

        Date a = cal.getTime();
        System.out.println("整体设置年月日,转成Date输出:"+a);
        //Calendar直接输出年月日用cal.getTime()(本质是转成Date,Date用toString再输出),
        //可以格式化输出(本质是转化成Date作为格式化的参数)
        //Date类里面的getTime()是获取的毫秒

        System.out.println("天:"+cal.get(5));
        cal.add(Calendar.DAY_OF_MONTH,-2);  // 日期减少两天,是使用Calender类而不用Date的重要方法
        // roll()方法与add()相比,它不会改变较高位的字段。如1.31用roll()加1天为1.1,而add()则为2.1
        System.out.println("天-2:"+cal.get(Calendar.DAY_OF_MONTH));

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = sdf.format(cal.getTime());
        System.out.println("格式化输出"+date);

        String ss = "2022-3-32";     //自动转化为4月1
        try {
            Date date1 = sdf.parse(ss);
            System.out.println("字符串转化为Date:" + date1);
            System.out.println("格式化输出Date:" + sdf.format(date1));

        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}
